package lp2.projeto.horario;

import java.util.Calendar;
import java.util.GregorianCalendar;

import org.junit.*;

/**
 * Classe responsavel por testar a classe horario
 */
public class TestaHorario {
	/**
	 * Testa os getters
	 */
	@Test public void testaGetters() {
		Horario horario = new Horario(2011, Mes.OUTUBRO, 20, 8, 13);
		Assert.assertEquals(2011, horario.getAno());
		Assert.assertEquals(Mes.OUTUBRO, horario.getMes());
		Assert.assertEquals(20, horario.getDia());
		Assert.assertEquals(8, horario.getHora());
		Assert.assertEquals(13, horario.getMinuto());
	}
	
	/**
	 * Testa o metodo getHoraAtual
	 */
	@Test public void testaGetHoraAtual() {
		Assert.assertTrue(Horario.getHoraAtual() != null);
	}
	
	/**
	 * Testa o metodo equals
	 */
	@Test public void testaEquals() {
		Horario horario1 = new Horario(2011, Mes.OUTUBRO, 20, 8, 13);
		Horario horario2 = new Horario(2011, Mes.OUTUBRO, 20, 8, 13);
		Horario horario3 = new Horario(2011, Mes.NOVEMBRO, 20, 8, 13);
		Assert.assertTrue(horario1.equals(horario2));
		Assert.assertFalse(horario1.equals(horario3));
	}
	
	/**
	 * Testa os metodos que envolvem GregorianCalendar
	 */
	@Test public void testaCalendar() {
		Calendar calendar = new GregorianCalendar();
		calendar.set(Calendar.YEAR, 2010);
		calendar.set(Calendar.MONTH, Mes.FEVEREIRO.getNumero()-1);
		calendar.set(Calendar.DAY_OF_MONTH, 12);
		calendar.set(Calendar.HOUR_OF_DAY, 15);
		calendar.set(Calendar.MINUTE, 30);
		
		Horario horario = new Horario(calendar);
		
		Assert.assertEquals(2010, horario.getAno());
		Assert.assertEquals(Mes.FEVEREIRO, horario.getMes());
		Assert.assertEquals(12, horario.getDia());
		Assert.assertEquals(15, horario.getHora());
		Assert.assertEquals(30, horario.getMinuto());
		
		Calendar calendar2 = horario.toCalendar();
		
		int[] campos_uteis = new int[]{Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH, Calendar.HOUR_OF_DAY, Calendar.MINUTE};
		for (int i = 0; i < campos_uteis.length; i++)
			Assert.assertEquals(calendar.get(campos_uteis[i]), calendar2.get(campos_uteis[i]));
	}
	
	/**
	 * Testa o metodo compareTo
	 */
	@Test public void testaCompareTo() {
		Horario[] horarios = new Horario[]{
				new Horario(2010, Mes.OUTUBRO, 20, 8, 13),
				new Horario(2011, Mes.OUTUBRO, 20, 8, 13),
				new Horario(2011, Mes.OUTUBRO, 22, 8, 13),
				new Horario(2011, Mes.OUTUBRO, 22, 9, 13),
				new Horario(2011, Mes.OUTUBRO, 22, 9, 14),
				new Horario(2011, Mes.NOVEMBRO, 22, 9, 14)
		};
		for (int i = 0; i+1 < horarios.length; i++) {
			Assert.assertTrue(horarios[i].compareTo(horarios[i+1]) < 0);
			Assert.assertTrue(horarios[i+1].compareTo(horarios[i]) > 0);
		}
		Horario horario1 = new Horario(2011, Mes.OUTUBRO, 20, 8, 13);
		Horario horario2 = new Horario(2011, Mes.OUTUBRO, 20, 8, 13);
		
		Assert.assertEquals(0, horario1.compareTo(horario2));
	}
	
	/**
	 * Testa o metodo toString
	 */
	@Test public void testaToString() {
		Horario horario1 = new Horario(2011, Mes.OUTUBRO, 20, 8, 13);
		Assert.assertEquals("20/10/2011 8:13", horario1.toString());
	}
}
